package com.ysg.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 处理加减乘除工具类，保留几位小数
 **/
public class YBigDecimalUtil {
    public static final Integer SCALE_DEFAULT = 5;
    public static final Integer SCALE_MONEY = 2;


    /**
     * 加法：默认保留5位
     */
    public static BigDecimal add(Object o1, Object o2) {
        return add(o1, o2, SCALE_DEFAULT);
    }
    /**
     * 加法：金额默认2位
     */
    public static BigDecimal addMoney(Object o1, Object o2) {
        return add(o1, o2, SCALE_MONEY);
    }

    /**
     * 减法：默认保留5位；如果是金额保留2位
     */
    public static BigDecimal sub(Object o1, Object o2) {
        return sub(o1, o2, SCALE_DEFAULT);
    }

    /**
     * 减法：默认保留5位；如果是金额保留2位
     */
    public static BigDecimal subMoney(Object o1, Object o2) {
        return sub(o1, o2, SCALE_MONEY);
    }

    /**
     * 减法：默认保留5位；如果是金额保留2位
     */
    public static BigDecimal sub(Object o1, Object o2, int scale) {
        BigDecimal b1 = BigDecimal.ZERO;
        BigDecimal b2 = BigDecimal.ZERO;
        if (o1 != null && YStringUtil.isNotEmpty(o1.toString())){
            b1 = new BigDecimal(o1.toString());
        }
        if (o2 != null && YStringUtil.isNotEmpty(o2.toString())){
            b2 = new BigDecimal(o2.toString());
        }
        BigDecimal b = b1.subtract(b2);
        return b.setScale(scale, BigDecimal.ROUND_DOWN);
    }

    /**
     * 加法：默认保留5位；如果是金额保留2位
     */
    public static BigDecimal add(Object o1, Object o2, int scale) {
        BigDecimal b1 = BigDecimal.ZERO;
        BigDecimal b2 = BigDecimal.ZERO;
        if (o1 != null && YStringUtil.isNotEmpty(o1.toString())){
            b1 = new BigDecimal(o1.toString());
        }
        if (o2 != null && YStringUtil.isNotEmpty(o2.toString())){
            b2 = new BigDecimal(o2.toString());
        }
        BigDecimal b = b1.add(b2);
        return b.setScale(scale, BigDecimal.ROUND_DOWN);
    }


    /**
     * double转为BigDecimal
     */
    public static BigDecimal doubleTo(Double d){
        BigDecimal b = BigDecimal.ZERO;
        if (d != null && YStringUtil.isNotEmpty(d.toString())){
            b = new BigDecimal(d.toString());
//            b = new BigDecimal(d);//TODO 不能用这样，会有小数精确问题
        }
        return b;
    }

    /**
     * BigDecimal转为Double
     */
    public static Double toDouble(Object o){
        BigDecimal b = BigDecimal.ZERO;
        if (o != null && YStringUtil.isNotEmpty(o.toString())){
            b = new BigDecimal(o.toString());
        }
        return b.doubleValue();
    }

    /**
     * 金额：保留2位小数
     */
    public static BigDecimal multiply(Object o1, Object o2) {
        return multiply(o1, o2, SCALE_DEFAULT);
    }

    /**
     * 金额：保留2位小数
     */
    public static BigDecimal multiplyMoney(Object o1, Object o2) {
        return multiply(o1, o2, SCALE_MONEY);
    }

    /**
     * 金额：保留2位小数
     */
    public static BigDecimal multiply(Object o1, Object o2, int scale) {
        BigDecimal b1 = BigDecimal.ZERO;
        BigDecimal b2 = BigDecimal.ZERO;
        if (o1 != null && YStringUtil.isNotEmpty(o1.toString())){
            b1 = new BigDecimal(o1.toString());
        }
        if (o2 != null && YStringUtil.isNotEmpty(o2.toString())){
            b2 = new BigDecimal(o2.toString());
        }
        BigDecimal b = b1.multiply(b2);
        return b.setScale(scale, BigDecimal.ROUND_DOWN);
    }

    /**
     * 除法：默认保留5位；如果是金额保留2位
     */
    public static BigDecimal divide(Object o1, Object o2) {
        return divide(o1, o2, SCALE_DEFAULT);
    }
    /**
     * 除法：默认保留5位；如果是金额保留2位
     */
    public static BigDecimal divideMoney(Object o1, Object o2) {
        return divide(o1, o2, SCALE_MONEY);
    }

    /**
     * 除法：默认保留5位；如果是金额保留2位
     * TODO 除法要指定精确位数
     */
    public static BigDecimal divide(Object o1, Object o2, int scale) {
        BigDecimal b1 = BigDecimal.ZERO;
        BigDecimal b2 = BigDecimal.ZERO;
        if (o1 != null && YStringUtil.isNotEmpty(o1.toString())){
            b1 = new BigDecimal(o1.toString());
        }
        if (o2 != null && YStringUtil.isNotEmpty(o2.toString())){
            b2 = new BigDecimal(o2.toString());
        }
        if (b2 == BigDecimal.ZERO){
            return BigDecimal.ZERO;
        }
        return b1.divide(b2, scale, BigDecimal.ROUND_DOWN);
    }

    /**
     * 去掉尾数0
     */
    public static String show(Object o) {
        String b = "";
        if (o != null && YStringUtil.isNotEmpty(o.toString())){
            b = new BigDecimal(o.toString()).stripTrailingZeros().toPlainString();
        }
        return b;
    }

    /**
     * 保留2位小数
     */
    public static BigDecimal showAmount(Object o) {
        BigDecimal b = BigDecimal.ZERO;
        if (o != null && YStringUtil.isNotEmpty(o.toString())){
            b = new BigDecimal(o.toString());
        }
        b = b.setScale(2, RoundingMode.HALF_DOWN);
        return b;
    }

    /**
     * BigDecimal转换为百分比
     */
    public static String showPercent(Object o){
        BigDecimal b = BigDecimal.ZERO;
        if (o != null && YStringUtil.isNotEmpty(o.toString())){
            b = new BigDecimal(o.toString()).multiply(new BigDecimal(100));
        }
        return  show(b);
    }

    /**
     * 百分比转换为BigDecimal
     */
    public static Double percentTo(String percent){
        BigDecimal percentB = BigDecimal.ZERO;
        if (percent != null && YStringUtil.isNotEmpty(percent)){
            percentB = new BigDecimal(percent);
        }
        return  percentB.divide(new BigDecimal(100)).doubleValue();
    }











    //-------------------------------------------------------------------
    /**
     * 比较v1 v2大小
     *
     * @param v1 v1
     * @param v2 v2
     * @return int(v1 > v2 return 1 v1 = v2 return 0 v1 < v2 return - 1)
     */
    public static int doubleCompareTo(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.compareTo(b2);
    }

    public static int floatCompareTo(float v1, float v2) {
        BigDecimal b1 = new BigDecimal(Float.toString(v1));
        BigDecimal b2 = new BigDecimal(Float.toString(v2));
        return b1.compareTo(b2);
    }
}
